home *** CD-ROM | disk | FTP | other *** search
/ Programming Sound Cards / Programming Sound Cards.iso / sound_89 / vocplay.doc < prev   
Text File  |  1995-01-01  |  4KB  |  96 lines

  1. ─ Area: 80x86 Assembler ──────────────────────────────────────────────────────
  2.   Msg#: 34                                           Date: 01-18-93  16:00
  3.   From: Phil Inch                                    Network: GT Power
  4.     To: Edward Schlunder
  5.   Subj: Playing VOCs on PC's Internal Speaker.
  6. ──────────────────────────────────────────────────────────────────────────────
  7.  
  8. OK, now I'm not saying this is the "best" or "correct" way to play these
  9. files (see note below) but it does work.  Instead of posting actual code
  10. I'll just describe the method, so you and other readers can use their
  11. programming language of choice!
  12.  
  13. FIRST: Open the VOC file and skip the first 26 bytes.  This is header
  14. information among which the only useful info is the speed at which the VOC
  15. was recorded.  For this message I won't go into how to do timing correctly.
  16.  
  17. NOW, set a "timing" variable.  This variable will be used as a delay counter
  18. later on.  It's just an integer, and in assembler I've found that 256 works
  19. well.  (This will make sense later).
  20.  
  21. OK, for EACH BYTE, follow this process:
  22.  
  23.    1) If the byte = 127, go to step 5
  24.  
  25.    2) Push the speaker "out".  In ASM, this is done by:
  26.  
  27.          IN    AL,61h
  28.          OR    AL,3h
  29.          OUT   61h,AL
  30.  
  31.    3) Delay for ( BYTE / 256 ) * TIMING VARIABLE.  This could be a FOR/NEXT
  32.       loop or whatever.  In assembler, I use LOOPNZ
  33.  
  34.    4) Pull the speaker back "in".  In ASM:
  35.  
  36.          IN    AL,61h
  37.          AND   AL,FCh
  38.          OUT   61h,AL
  39.  
  40.    5) Delay for the remaining balance of TIMING VARIABLE.
  41.  
  42.    6) Return to step 1 until the end of the file is encountered.
  43.  
  44. So what the hell is it doing?  It's actually fairly simple.  Steps 2-4 allow
  45. you to "pulse" the speaker with a varying force.  The amount of force is
  46. determined by the length of the delay in step 3.  In other words,
  47. the shorter the delay, the less time the speaker has to move out before it's
  48. pulled back in.
  49.  
  50. This should tell you straight away that the code in step 3 needs to be TIGHT.
  51. I really feel that assembler is the only tool for this job, but I am happy
  52. to be proved wrong.  Personally I use assembler.
  53.  
  54. The basic trick is this; the bytes in a VOC file determine the waveform,
  55. although it's important to note that VOC files can be "packed".  I'll explain
  56. this later.  If you want to see what I mean, write a program to read the value
  57. of each byte in the file and plot this byte on a graph...lo and behold, you
  58. will see the waveform before your very eyes!  127 is the middle value, and
  59. the waveform rises above and below this value.
  60.  
  61. So, if the byte is 1, the above makes this a very short (read:quiet) pulse.
  62. If it's 255, it's a long (read:loud) pulse.  Everything in between is
  63. varying degrees from soft to loud, except for 127 which is considered to be
  64. "silence".
  65.  
  66. You should now see that steps 3 and 5 "divide" the timing delay into a
  67. "pulse" and "silence" part.  Overall, however, you still end up delaying for
  68. the total duration of the timing variable.  Therefore, you should progress
  69. through the file at an even rate!
  70.  
  71. Now, a few notes.  First, it's desirable to load the file into memory first
  72. as disk access *really* bogs the whole thing down.  Second, if you want to
  73. play them at the correct rate, you'll have to get into programming interrupts
  74. because that's the only reliable way to do this.  Third: packed VOC files may
  75. not sound correct.
  76.  
  77. I am developing a program called VOC-IT, which will play VOCS as explained
  78. above, and allow you to play them more quickly or slowly, and it will deal
  79. with packed VOCS correctly.  I will also be offering source code for a small
  80. consideration.  Got to have some return <grin>!  I have already released
  81. VOCHDR, which reads and displays the header information of one or more VOC
  82. files in the current directory.  Look out for it - I'm working under the name
  83. "Imperial Software".
  84.  
  85. Regards
  86. Phil
  87.  
  88.  ───────────────────────═══════════════════════════─────────────────────────
  89.  
  90.     Again, my thanks go to Phil for giving out the information about how
  91.   his programs work, even if it means giving up the chance to get
  92.   registrations for his work. Phil is truly a great guy. Please support him,
  93.   don't go into competition!
  94.  
  95.      - Edward T. Schlunder
  96.